package com.example.ytyproject.component;

import com.antherd.smcrypto.sm4.Sm4;
import com.antherd.smcrypto.sm4.Sm4Options;

/**
 * 国密算法代码实现
 */

public class SmAutherdComponent {

    public static void main(String[] args) {
        encrypt();
        System.out.println("-------------------------");
        decrypt();
    }

    public static void encrypt() {
        String msg = "大家好，我是国密加密算法";
        String key = "werf45edu9abcde345dcba9t7654ws34"; // 16 进制字符串，要求为 128 比特

        String encryptData1 = Sm4.encrypt(msg, key); // 加密，默认使用 pkcs#5 填充，输出16进制字符串

        Sm4Options sm4Options2 = new Sm4Options();
        sm4Options2.setPadding("none");
        String encryptData2 = Sm4.encrypt(msg, key, sm4Options2); // 加密，不使用 padding，输出16进制字符串

        Sm4Options sm4Options3 = new Sm4Options();
        sm4Options3.setPadding("none");
        byte[] encryptData3 = Sm4.hexToBytes(Sm4.encrypt(msg, key, sm4Options3)); // 加密，不使用 padding，输出转为字节数组

        Sm4Options sm4Options4 = new Sm4Options();
        sm4Options4.setMode("cbc");
        sm4Options4.setIv("fedcba98765432100123456789abcdef");
        String encryptData4 = Sm4.encrypt(msg, key, sm4Options4); // 加密，cbc 模式，输出16进制字符串
        System.out.println("国密算法加密1：" + encryptData1);
        System.out.println("国密算法加密2：" + encryptData2);
        System.out.println("国密算法加密3：" + encryptData3);
        System.out.println("国密算法加密4：" + encryptData4);
    }

    public static void decrypt() {
        String encryptData = "0134da87fb6bd695161026b532a3afea3122e647bd94ddf06016867e7363bc5082adc8b33f8b91f88f4c7099b851d96f"; // 加密后的 16 进制字符串
        String key = "werf45edu9abcde345dcba9t7654ws34"; // 16 进制字符串，要求为 128 比特

        String decryptData5 = Sm4.decrypt(encryptData, key); // 解密，默认使用 pkcs#5 填充，输出 utf8 字符串

        Sm4Options sm4Options6 = new Sm4Options();
        sm4Options6.setPadding("none");
        String decryptData6 = Sm4.decrypt(encryptData, key, sm4Options6); // 解密，不使用 padding，输出 utf8 字符串

        Sm4Options sm4Options7 = new Sm4Options();
        sm4Options7.setPadding("none");
        byte[] decryptData7 = Sm4.utf8ToArray(Sm4.decrypt(encryptData, key, sm4Options7)); // 解密，不使用 padding，输出转为字节数组

        Sm4Options sm4Options8 = new Sm4Options();
        sm4Options8.setMode("cbc");
        sm4Options8.setIv("fedcba98765432100123456789abcdef");
        String decryptData8 = Sm4.decrypt(encryptData, key, sm4Options8); // 解密，cbc 模式，输出 utf8 字符串
        System.out.println("国密算法解密1：" + decryptData5);
        System.out.println("国密算法解密2：" + decryptData6);
        System.out.println("国密算法解密3：" + decryptData7);
        System.out.println("国密算法解密4：" + decryptData8);
    }
}
